package com.sap.csc;

import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class MultipartRequestHandler {

	public static List<FileMeta> uploadByJavaServletAPI(HttpServletRequest request) throws IOException, ServletException{
		 
        List<FileMeta> files = new LinkedList<FileMeta>();
 
        // 1. Get all parts
        Collection<Part> parts = request.getParts();
 
        // 2. Get paramter "twitter"
        String username = request.getParameter("fullname");
        
        // 3. Go over each part
        FileMeta temp = null;
        for(Part part:parts){   
 
            // 3.1 if part is multiparts "file"
            if(part.getContentType() != null){
 
                // 3.2 Create a new FileMeta object
                temp = new FileMeta();
                temp.setFileName(getFilename(part));
                temp.setFileSize(part.getSize()/1024 +" Kb");
                temp.setFileType(part.getContentType());
                temp.setUserName(username);
                temp.setContent(part.getInputStream());
                
                
                System.out.println("file name:"+getFilename(part));
                System.out.println("file type:"+part.getContentType());
                // 3.3 Add created FileMeta object to List<FileMeta> files
                files.add(temp);
 
            }
        }
        return files;
    }
	
	public static List<FileMeta> uploadByApacheFileUpload(HttpServletRequest request) throws IOException, ServletException{
		 
        List<FileMeta> files = new LinkedList<FileMeta>();
 
        // 1. Check request has multipart content
        boolean isMultipart = ServletFileUpload.isMultipartContent(request);
        FileMeta temp = null;
 
        // 2. If yes (it has multipart "files")
        if(isMultipart){
 
            // 2.1 instantiate Apache FileUpload classes
            DiskFileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
 
            // 2.2 Parse the request
            try {
 
                // 2.3 Get all uploaded FileItem
                List<FileItem> items = upload.parseRequest(request);
                String twitter = "";
 
                // 2.4 Go over each FileItem
                for(FileItem item:items){
 
                    // 2.5 if FileItem is not of type "file"
                    if (item.isFormField()) {
 
                        // 2.6 Search for "twitter" parameter
                        if(item.getFieldName().equals("twitter"))
                            twitter = item.getString();
 
                    } else {
 
                        // 2.7 Create FileMeta object
                        temp = new FileMeta();
                        InputStream uploadedStream = item.getInputStream();
                        temp.setFileName(item.getName());
                        temp.setContent(uploadedStream);
                        temp.setFileType(item.getContentType());
                        temp.setFileSize(item.getSize()/1024+ "Kb");
                        temp.setByteArray(item.get());
 
                        // 2.7 Add created FileMeta object to List<FileMeta> files
                        files.add(temp);
 
                        uploadedStream.close();
                    }
                }
 
                // 2.8 Set "twitter" parameter 
                /*for(FileMeta fm:files){
                    fm.setUserName(twitter);
                }*/
 
            } catch (FileUploadException e) {
                e.printStackTrace();
            }
        }
        return files;
    }
	
	// this method is used to get file name out of request headers
    // 
    private static String getFilename(Part part) {
        for (String cd : part.getHeader("content-disposition").split(";")) {
            if (cd.trim().startsWith("filename")) {
                String filename = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
                return filename.substring(filename.lastIndexOf('/') + 1).substring(filename.lastIndexOf('\\') + 1); // MSIE fix.
            }
        }
        return null;
    }
    
}
